Disco Diffusion#

This is an simple way of creating compelling Disco Diffusion artworks for generative artists.

Prepare an environment#

from ekorpkit import eKonf

eKonf.setLogger("INFO")
eKonf.set_cuda(device=4)
print("version:", eKonf.__version__)

is_notebook = eKonf.is_notebook()
is_colab = eKonf.is_colab()
print("is notebook?", is_notebook)
print("is colab?", is_colab)
if is_colab:
    eKonf.mount_google_drive(
        workspace="MyDrive/colab_workspace", project="disco-imagen"
    )

print("environment variables:")
eKonf.print(eKonf.env().dict())
INFO:ekorpkit.base:Setting cuda device to ['A100-SXM4-40GB (id:4)']
INFO:ekorpkit.utils.notebook:shell type: ZMQInteractiveShell
INFO:ekorpkit.utils.notebook:Google Colab not detected.
version: 0.1.38+30.g9d5fcfc.dirty
is notebook? True
is colab? False
environment variables:
{'CUDA_DEVICE_ORDER': 'PCI_BUS_ID',
 'CUDA_VISIBLE_DEVICES': '4',
 'EKORPKIT_CONFIG_DIR': '/workspace/projects/ekorpkit-book/config',
 'EKORPKIT_DATA_DIR': None,
 'EKORPKIT_LOG_LEVEL': 'INFO',
 'EKORPKIT_PROJECT': 'ekorpkit-book',
 'EKORPKIT_WORKSPACE_ROOT': '/workspace',
 'KMP_DUPLICATE_LIB_OK': 'TRUE',
 'NUM_WORKERS': 230}

Create a disco instance#

cfg = eKonf.compose("model/disco")
disco = eKonf.instantiate(cfg)
print(f"Version: {disco.version}")
INFO:ekorpkit.base:Loaded .env from /workspace/projects/ekorpkit-book/config/.env
INFO:ekorpkit.utils.notebook:shell type: ZMQInteractiveShell
INFO:ekorpkit.base:setting environment variable CACHED_PATH_CACHE_ROOT to /workspace/.cache/cached_path
INFO:ekorpkit.base:setting environment variable KMP_DUPLICATE_LIB_OK to TRUE
INFO:ekorpkit.models.art.base:> downloading models...
INFO:ekorpkit.models.disco.base:Downloading model 256x256_diffusion_uncond from {'SHA': '983e3de6f95c88c81b2ca7ebb2c217933be1973b1ff058776b970f901584613a', 'filename': '256x256_diffusion_uncond.pt', 'link': 'https://openaipublic.blob.core.windows.net/diffusion/jul-2021/256x256_diffusion_uncond.pt', 'link_fb': 'https://www.dropbox.com/s/9tqnqo930mpnpcn/256x256_diffusion_uncond.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/256x256_diffusion_uncond.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/256x256_diffusion_uncond.pt'}
INFO:ekorpkit.models.disco.utils:Model 256x256_diffusion_uncond already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model 512x512_diffusion_uncond_finetune_008100 from {'SHA': '9c111ab89e214862b76e1fa6a1b3f1d329b1a88281885943d2cdbe357ad57648', 'filename': '512x512_diffusion_uncond_finetune_008100.pt', 'link': 'https://the-eye.eu/public/AI/models/512x512_diffusion_unconditional_ImageNet/512x512_diffusion_uncond_finetune_008100.pt', 'link_fb': 'https://huggingface.co/lowlevelware/512x512_diffusion_unconditional_ImageNet/resolve/main/512x512_diffusion_uncond_finetune_008100.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/512x512_diffusion_uncond_finetune_008100.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/512x512_diffusion_uncond_finetune_008100.pt'}
INFO:ekorpkit.models.disco.utils:Model 512x512_diffusion_uncond_finetune_008100 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model portrait_generator_v001 from {'SHA': 'b7e8c747af880d4480b6707006f1ace000b058dd0eac5bb13558ba3752d9b5b9', 'filename': 'portrait_generator_v001_ema_0.9999_1MM.pt', 'link': 'https://huggingface.co/felipe3dartist/portrait_generator_v001/resolve/main/portrait_generator_v001_ema_0.9999_1MM.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/portrait_generator_v001_ema_0.9999_1MM.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/portrait_generator_v001_ema_0.9999_1MM.pt'}
INFO:ekorpkit.models.disco.utils:Model portrait_generator_v001 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model pixelartdiffusion_expanded from {'SHA': 'a73b40556634034bf43b5a716b531b46fb1ab890634d854f5bcbbef56838739a', 'filename': 'PADexpanded.pt', 'link': 'https://huggingface.co/KaliYuga/PADexpanded/resolve/main/PADexpanded.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/PADexpanded.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/PADexpanded.pt'}
INFO:ekorpkit.models.disco.utils:Model pixelartdiffusion_expanded already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model pixel_art_diffusion_hard_256 from {'SHA': 'be4a9de943ec06eef32c65a1008c60ad017723a4d35dc13169c66bb322234161', 'filename': 'pixel_art_diffusion_hard_256.pt', 'link': 'https://huggingface.co/KaliYuga/pixel_art_diffusion_hard_256/resolve/main/pixel_art_diffusion_hard_256.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/pixel_art_diffusion_hard_256.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/pixel_art_diffusion_hard_256.pt'}
INFO:ekorpkit.models.disco.utils:Model pixel_art_diffusion_hard_256 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model pixel_art_diffusion_soft_256 from {'SHA': 'd321590e46b679bf6def1f1914b47c89e762c76f19ab3e3392c8ca07c791039c', 'filename': 'pixel_art_diffusion_soft_256.pt', 'link': 'https://huggingface.co/KaliYuga/pixel_art_diffusion_soft_256/resolve/main/pixel_art_diffusion_soft_256.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/pixel_art_diffusion_soft_256.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/pixel_art_diffusion_soft_256.pt'}
INFO:ekorpkit.models.disco.utils:Model pixel_art_diffusion_soft_256 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model pixelartdiffusion4k from {'SHA': 'a1ba4f13f6dabb72b1064f15d8ae504d98d6192ad343572cc416deda7cccac30', 'filename': 'pixelartdiffusion4k.pt', 'link': 'https://huggingface.co/KaliYuga/pixelartdiffusion4k/resolve/main/pixelartdiffusion4k.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/pixelartdiffusion4k.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/pixelartdiffusion4k.pt'}
INFO:ekorpkit.models.disco.utils:Model pixelartdiffusion4k already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model watercolordiffusion_2 from {'SHA': '49c281b6092c61c49b0f1f8da93af9b94be7e0c20c71e662e2aa26fee0e4b1a9', 'filename': 'watercolordiffusion_2.pt', 'link': 'https://huggingface.co/KaliYuga/watercolordiffusion_2/resolve/main/watercolordiffusion_2.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/watercolordiffusion_2.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/watercolordiffusion_2.pt'}
INFO:ekorpkit.models.disco.utils:Model watercolordiffusion_2 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model watercolordiffusion from {'SHA': 'a3e6522f0c8f278f90788298d66383b11ac763dd5e0d62f8252c962c23950bd6', 'filename': 'watercolordiffusion.pt', 'link': 'https://huggingface.co/KaliYuga/watercolordiffusion/resolve/main/watercolordiffusion.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/watercolordiffusion.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/watercolordiffusion.pt'}
INFO:ekorpkit.models.disco.utils:Model watercolordiffusion already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model PulpSciFiDiffusion from {'SHA': 'b79e62613b9f50b8a3173e5f61f0320c7dbb16efad42a92ec94d014f6e17337f', 'filename': 'PulpSciFiDiffusion.pt', 'link': 'https://huggingface.co/KaliYuga/PulpSciFiDiffusion/resolve/main/PulpSciFiDiffusion.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/PulpSciFiDiffusion.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/PulpSciFiDiffusion.pt'}
INFO:ekorpkit.models.disco.utils:Model PulpSciFiDiffusion already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model model_secondary from {'SHA': '983e3de6f95c88c81b2ca7ebb2c217933be1973b1ff058776b970f901584613a', 'filename': 'secondary_model_imagenet_2.pth', 'link': 'https://huggingface.co/spaces/huggi/secondary_model_imagenet_2.pth/resolve/main/secondary_model_imagenet_2.pth', 'link_fb': 'https://the-eye.eu/public/AI/models/v-diffusion/secondary_model_imagenet_2.pth', 'archive_path': '/workspace/data/archive/disco-imagen/models/secondary_model_imagenet_2.pth', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/secondary_model_imagenet_2.pth'}
INFO:ekorpkit.models.disco.utils:Model model_secondary already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model MiDaS from {'filename': 'dpt_large-midas-2f21e586.pt', 'link': 'https://github.com/intel-isl/DPT/releases/download/1_0/dpt_large-midas-2f21e586.pt', 'archive_path': '/workspace/data/archive/disco-imagen/models/dpt_large-midas-2f21e586.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/dpt_large-midas-2f21e586.pt'}
INFO:ekorpkit.models.disco.utils:Model MiDaS already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model model-lpips from {'filename': 'vgg16-397923af.pth', 'link': 'https://download.pytorch.org/models/vgg16-397923af.pth', 'archive_path': '/workspace/data/archive/disco-imagen/model-lpips/vgg16-397923af.pth', 'path': '/root/.cache/torch/hub/checkpoints/vgg16-397923af.pth'}
INFO:ekorpkit.models.disco.utils:Model model-lpips already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model AdaBins from {'filename': 'AdaBins_nyu.pt', 'link': 'https://cloudflare-ipfs.com/ipfs/Qmd2mMnDLWePKmgfS8m6ntAg4nhV5VkUyAydYBp8cWWeB7/AdaBins_nyu.pt', 'archive_path': '/workspace/data/archive/disco-imagen/pretrained/AdaBins_nyu.pt', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/pretrained/AdaBins_nyu.pt'}
INFO:ekorpkit.models.disco.utils:Model AdaBins already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RN50 from {'filename': 'RN50.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/RN50.pt', 'path': '/root/.cache/clip/RN50.pt'}
INFO:ekorpkit.models.disco.utils:Model RN50 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RN101 from {'filename': 'RN101.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/RN101.pt', 'path': '/root/.cache/clip/RN101.pt'}
INFO:ekorpkit.models.disco.utils:Model RN101 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RN50x4 from {'filename': 'RN50x4.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/RN50x4.pt', 'path': '/root/.cache/clip/RN50x4.pt'}
INFO:ekorpkit.models.disco.utils:Model RN50x4 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RN50x16 from {'filename': 'RN50x16.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/52378b407f34354e150460fe41077663dd5b39c54cd0bfd2b27167a4a06ec9aa/RN50x16.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/RN50x16.pt', 'path': '/root/.cache/clip/RN50x16.pt'}
INFO:ekorpkit.models.disco.utils:Model RN50x16 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RN50x64 from {'filename': 'RN50x64.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/be1cfb55d75a9666199fb2206c106743da0f6468c9d327f3e0d0a543a9919d9c/RN50x64.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/RN50x64.pt', 'path': '/root/.cache/clip/RN50x64.pt'}
INFO:ekorpkit.models.disco.utils:Model RN50x64 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model ViT-B-32 from {'filename': 'ViT-B-32.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/ViT-B-32.pt', 'path': '/root/.cache/clip/ViT-B-32.pt'}
INFO:ekorpkit.models.disco.utils:Model ViT-B-32 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model ViT-B-16 from {'filename': 'ViT-B-16.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/5806e77cd80f8b59890b7e101eabd078d9fb84e6937f9e85e4ecb61988df416f/ViT-B-16.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/ViT-B-16.pt', 'path': '/root/.cache/clip/ViT-B-16.pt'}
INFO:ekorpkit.models.disco.utils:Model ViT-B-16 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model ViT-L-14 from {'filename': 'ViT-L-14.pt', 'link': 'https://openaipublic.azureedge.net/clip/models/b8cca3fd41ae0c99ba7e8951adf17d267cdb84cd88be6f7c2e0eca1737a03836/ViT-L-14.pt', 'archive_path': '/workspace/data/archive/disco-imagen/clip/ViT-L-14.pt', 'path': '/root/.cache/clip/ViT-L-14.pt'}
INFO:ekorpkit.models.disco.utils:Model ViT-L-14 already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.disco.base:Downloading model RAFT from {'filename': 'raft-things.pth', 'link': 'https://www.dropbox.com/s/4j4z58wuv8o0mfz/models.zip?dl=1', 'archive_path': '/workspace/data/archive/disco-imagen/models/RAFT/models/raft-things.pth', 'path': '/workspace/projects/ekorpkit-book/disco-imagen/models/raft-things.pth', 'zip_path': '/workspace/data/archive/disco-imagen/models/RAFT/models.zip', 'unzip': True}
INFO:ekorpkit.models.disco.utils:Model RAFT already downloaded, set check_model_SHA to true if the file is corrupt
INFO:ekorpkit.models.art.base:> loading modules...
INFO:ekorpkit.utils.lib:clip not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/CLIP as clip
INFO:torch.distributed.nn.jit.instantiator:Created a temporary directory at /tmp/tmporuh0o5e
INFO:torch.distributed.nn.jit.instantiator:Writing /tmp/tmporuh0o5e/_remote_module_non_sriptable.py
INFO:ekorpkit.utils.lib:open_clip not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/open_clip/src as open_clip
INFO:ekorpkit.utils.lib:guided_diffusion.script_util not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/guided-diffusion as guided_diffusion.script_util
INFO:ekorpkit.utils.lib:resize_right not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/ResizeRight as resize_right
INFO:ekorpkit.utils.lib:py3d_tools not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/pytorch3d-lite as py3d_tools
INFO:ekorpkit.utils.lib:midas.dpt_depth not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/MiDaS as midas.dpt_depth
INFO:ekorpkit.utils.lib:utils not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/MiDaS as midas_utils
INFO:ekorpkit.utils.lib:infer not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/AdaBins as infer
INFO:ekorpkit.utils.lib:utils.flow_viz not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/RAFT/core as flow_viz
INFO:ekorpkit.utils.lib:utils.utils not imported, loading from /workspace/projects/ekorpkit-book/disco-imagen/libs/RAFT/core as utils.utils
INFO:ekorpkit.utils.lib:raft imported
INFO:ekorpkit.models.art.base:> loading models...
INFO:ekorpkit.models.disco.base:> loading diffusion models...
INFO:ekorpkit.models.disco.base:Using device:cuda:4
INFO:ekorpkit.models.disco.base:Disabling CUDNN for A100 gpu
INFO:ekorpkit.models.disco.base:Loading diffusion model: 512x512_diffusion_uncond_finetune_008100
INFO:ekorpkit.models.disco.base:Loading secondary model: /workspace/projects/ekorpkit-book/disco-imagen/models/secondary_model_imagenet_2.pth
INFO:ekorpkit.models.disco.base:> loading clip models...
INFO:root:Loading ViT-B-32 model config.
INFO:root:Loading pretrained ViT-B-32 weights (laion400m_e32).
INFO:root:Loading RN50 model config.
INFO:root:Loading pretrained RN50 weights (cc12m).
Setting up [LPIPS] perceptual loss: trunk [vgg], v[0.1], spatial [off]
Loading model from: /opt/conda/lib/python3.8/site-packages/lpips/weights/v0.1/vgg.pth
Version: v5.61

Image only mode#

disco.config.models.openclip_models.RN101_quickgelu_yfcc15m = True
disco.config.models.openclip_models.ViTB32_laion2b_e16 = True
disco.config.models.diffusion_model = "watercolordiffusion"
eKonf.print(disco.config.models)
# If you change model configs, you have to reload models
disco.load_models()
INFO:ekorpkit.models.disco.base:> loading diffusion models...
INFO:ekorpkit.models.disco.base:Using device:cuda:4
INFO:ekorpkit.models.disco.base:Disabling CUDNN for A100 gpu
INFO:ekorpkit.models.disco.base:Loading diffusion model: watercolordiffusion
INFO:ekorpkit.models.disco.base:Loading secondary model: /workspace/projects/ekorpkit-book/disco-imagen/models/secondary_model_imagenet_2.pth
INFO:ekorpkit.models.disco.base:> loading clip models...
{'clip_models': {'RN101': False,
                 'RN50': False,
                 'RN50x16': False,
                 'RN50x4': False,
                 'RN50x64': False,
                 'ViTB16': True,
                 'ViTB32': True,
                 'ViTL14': False,
                 'ViTL14_336px': False},
 'custom_model': 'ema_0.9999_058000.pt',
 'diffusion_model': 'watercolordiffusion',
 'openclip_models': {'RN101_quickgelu_yfcc15m': True,
                     'RN101_yfcc15m': False,
                     'RN50_cc12m': True,
                     'RN50_quickgelu_cc12m': False,
                     'RN50_quickgelu_yfcc15m': False,
                     'RN50_yffcc15m': False,
                     'ViTB16_laion400m_e31': False,
                     'ViTB16_laion400m_e32': False,
                     'ViTB32_laion2b_e16': True,
                     'ViTB32_laion400m_e31': False,
                     'ViTB32_laion400m_e32': True,
                     'ViTB32quickgelu_laion400m_e31': False,
                     'ViTB32quickgelu_laion400m_e32': False}}
INFO:root:Loading ViT-B-32 model config.
INFO:root:Loading pretrained ViT-B-32 weights (laion2b_e16).
INFO:root:Loading ViT-B-32 model config.
INFO:root:Loading pretrained ViT-B-32 weights (laion400m_e32).
INFO:root:Loading RN50 model config.
INFO:root:Loading pretrained RN50 weights (cc12m).
INFO:root:Loading RN101-quickgelu model config.
INFO:root:Loading pretrained RN101-quickgelu weights (yfcc15m).
Setting up [LPIPS] perceptual loss: trunk [vgg], v[0.1], spatial [off]
Loading model from: /opt/conda/lib/python3.8/site-packages/lpips/weights/v0.1/vgg.pth
text_prompts = "A beautiful water painting of Jeju Island."
batch_name = "jeju"

results = disco.imagine(
    text_prompts, 
    batch_name=batch_name, 
    n_samples=2, 
    steps=200,
    show_collage=True,
    diffusion_sampling_mode='ddim',
    clip_guidance_scale=7500, 
    use_secondary_model=False,
)
INFO:ekorpkit.models.disco.base:Image prompt: []
INFO:ekorpkit.models.disco.base:Sample 1 Prompt: ['A beautiful painting of Jeju Island.']
INFO:ekorpkit.utils.notebook:shell type: ZMQInteractiveShell
INFO:ekorpkit.models.disco.base:Saved jeju(6)_0001.png
INFO:ekorpkit.models.disco.base:Seed used: 3610975411
INFO:ekorpkit.models.disco.base: >> elapsed time to diffuse: 0:11:05.648947
INFO:ekorpkit.models.art.base:Merging config with args: {}
INFO:ekorpkit.models.art.base:Prompt: A beautiful painting of Jeju Island.
2 samples generated to /workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju
text prompts: A beautiful painting of Jeju Island.
sample image paths:
/workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju/jeju(6)_0000.png
/workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju/jeju(6)_0001.png
../../../../_images/disco_12_6.png ../../../../_images/disco_12_7.png
INFO:ekorpkit.models.art.base:Saving config to /workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju/jeju(6)_settings.yaml
results
{'image_filepaths': ['/workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju/jeju(6)_0000.png',
  '/workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/jeju/jeju(6)_0001.png'],
 'config_file': 'jeju(6)_settings.yaml',
 'config': {'animation_mode': 'None',
  'batch_name': 'jeju',
  'display_rate': 20,
  'n_samples': 2,
  'batch_size': 1,
  'resume_run': False,
  'run_to_resume': 'latest',
  'resume_from_frame': 'latest',
  'retain_overwritten_frames': True,
  'show_collage': True,
  'diffusion_sampling_mode': 'ddim',
  'use_secondary_model': False,
  'steps': 200,
  'width_height': [512, 448],
  'width_height_for_512x512_models': [1280, 768],
  'width_height_for_256x256_models': [512, 448],
  'clip_guidance_scale': 7500,
  'tv_scale': 0,
  'range_scale': 150,
  'sat_scale': 0,
  'cutn_batches': 4,
  'skip_augs': False,
  'init_image': 'None',
  'init_scale': 1000,
  'skip_steps': 10,
  'frames_scale': 1500,
  'frames_skip_steps': '60%',
  'video_init_steps': 100,
  'video_init_clip_guidance_scale': 1000,
  'video_init_tv_scale': 0.1,
  'video_init_range_scale': 150,
  'video_init_sat_scale': 300,
  'video_init_cutn_batches': 4,
  'video_init_skip_steps': 50,
  'video_init_file': 'init.mp4',
  'video_init_path': '/workspace/projects/ekorpkit-book/disco-imagen/init_images/init.mp4',
  'extract_nth_frame': 2,
  'persistent_frame_output_in_batch_folder': True,
  'video_init_seed_continuity': False,
  'video_init_flow_warp': True,
  'video_init_flow_blend': 0.999,
  'video_init_check_consistency': False,
  'video_init_blend_mode': 'optical flow',
  'video_init_frames_scale': 15000,
  'video_init_frames_skip_steps': '70%',
  'force_flow_generation': False,
  'key_frames': True,
  'max_frames': 1,
  'interp_spline': 'Linear',
  'angle': '0:(0)',
  'zoom': '0: (1), 10: (1.05)',
  'translation_x': '0: (0)',
  'translation_y': '0: (0)',
  'translation_z': '0: (10.0)',
  'rotation_3d_x': '0: (0)',
  'rotation_3d_y': '0: (0)',
  'rotation_3d_z': '0: (0)',
  'midas_depth_model': 'dpt_large',
  'midas_weight': 0.3,
  'near_plane': 200,
  'far_plane': 10000,
  'fov': 40,
  'padding_mode': 'border',
  'sampling_mode': 'bicubic',
  'turbo_mode': False,
  'turbo_steps': '3',
  'turbo_preroll': 10,
  'vr_mode': False,
  'vr_eye_angle': 0.5,
  'vr_ipd': 5.0,
  'intermediate_saves': [],
  'steps_per_checkpoint': None,
  'intermediates_in_subfolder': True,
  'perlin_init': False,
  'perlin_mode': 'mixed',
  'set_seed': 'random_seed',
  'eta': 0.8,
  'clamp_grad': True,
  'clamp_max': 0.05,
  'randomize_class': True,
  'clip_denoised': False,
  'fuzzy_prompt': False,
  'rand_mag': 0.05,
  'cut_overview': '[14]*200+[12]*200+[4]*400+[0]*200',
  'cut_innercut': '[2]*200+[4]*200+[12]*400+[12]*200',
  'cut_ic_pow': '[12]*300+[12]*100+[12]*50+[12]*50+[10]*100+[10]*100+[10]*300',
  'cut_icgray_p': '[0.7]*100+[0.6]*100+[0.45]*100+[0.3]*100+[0]*600',
  'pad_or_pulp_cut_overview': '[15]*100+[15]*100+[12]*100+[12]*100+[6]*100+[4]*100+[2]*200+[0]*200',
  'pad_or_pulp_cut_innercut': '[1]*100+[1]*100+[4]*100+[4]*100+[8]*100+[8]*100+[10]*200+[10]*200',
  'pad_or_pulp_cut_ic_pow': '[12]*300+[12]*100+[12]*50+[12]*50+[10]*100+[10]*100+[10]*300',
  'pad_or_pulp_cut_icgray_p': '[0.87]*100+[0.78]*50+[0.73]*50+[0.64]*60+[0.56]*40+[0.50]*50+[0.33]*100+[0.19]*150+[0]*400',
  'watercolor_cut_overview': '[14]*200+[12]*200+[4]*400+[0]*200',
  'watercolor_cut_innercut': '[2]*200+[4]*200+[12]*400+[12]*200',
  'watercolor_cut_ic_pow': '[12]*300+[12]*100+[12]*50+[12]*50+[10]*100+[10]*100+[10]*300',
  'watercolor_cut_icgray_p': '[0.7]*100+[0.6]*100+[0.45]*100+[0.3]*100+[0]*600',
  'use_vertical_symmetry': False,
  'use_horizontal_symmetry': False,
  'transformation_percent': [0.09],
  'video_output': {'skip_video_for_run_all': False,
   'blend': 0.5,
   'video_init_check_consistency': False,
   'init_frame': 1,
   'last_frame': 'final_frame',
   'fps': 12,
   'view_video_in_cell': False},
  'models': {'diffusion_model': 'watercolordiffusion',
   'clip_models': {'ViTB32': True,
    'ViTB16': True,
    'ViTL14': False,
    'ViTL14_336px': False,
    'RN50x4': False,
    'RN50x16': False,
    'RN50x64': False,
    'RN50': False,
    'RN101': False},
   'openclip_models': {'ViTB32_laion2b_e16': True,
    'ViTB32_laion400m_e31': False,
    'ViTB32_laion400m_e32': True,
    'ViTB32quickgelu_laion400m_e31': False,
    'ViTB32quickgelu_laion400m_e32': False,
    'ViTB16_laion400m_e31': False,
    'ViTB16_laion400m_e32': False,
    'RN50_yffcc15m': False,
    'RN50_cc12m': True,
    'RN50_quickgelu_yfcc15m': False,
    'RN50_quickgelu_cc12m': False,
    'RN101_yfcc15m': False,
    'RN101_quickgelu_yfcc15m': True},
   'custom_model': 'ema_0.9999_058000.pt'},
  'text_prompts': {0: ['A beautiful painting of Jeju Island.']},
  'image_prompts': None,
  'batch_num': 6,
  'stop_on_next_loop': False,
  'side_x': 512,
  'side_y': 448,
  'calc_frames_skip_steps': 120,
  'start_frame': 0,
  'start_sample': 0,
  'seed': 3610975411}}

3D animation mode#

text_prompts = {
    0: "A beautiful new world in Jeju, artstation matte painting.",
    100: "Beautiful mountains in Jeju, artstation matte painting.",
    300: "A beautiful sea in Jeju, artstation matte painting.",
    500: "A beautiful woman in Jeju, artstation matte painting.",
    700: "A beautiful wind in Jeju, artstation matte painting.",
    900: "A beautiful new world in Jeju, artstation matte painting.",
}    
batch_name = "newworld-3d"

disco.imagine(
    text_prompts, 
    batch_name=batch_name, 
    batch_num=11,
    resume_run=True,
    steps=300,
    animation_mode="3D",
    rotation_3d_z="0: (0), 500: (1), 600: (-1)",
#     perlin_init=True,
#     perlin_mode="color",
    diffusion_sampling_mode='ddim',
    max_frames = 5000,
    width_height = [768, 512], 
    clip_guidance_scale=7500, 
)
INFO:ekorpkit.models.disco.base:translation_x: 0.0
INFO:ekorpkit.models.disco.base:translation_y: 0.0
INFO:ekorpkit.models.disco.base:translation_z: 10.0
INFO:ekorpkit.models.disco.base:rotation_3d_x: 0.0
INFO:ekorpkit.models.disco.base:rotation_3d_y: 0.0
INFO:ekorpkit.models.disco.base:rotation_3d_z: -0.6799999999999999
INFO:ekorpkit.models.disco.base:translation: [-0.0, 0.0, -0.05]
INFO:ekorpkit.models.disco.base:rotation: [0.0, 0.0, -0.6799999999999999]
INFO:ekorpkit.models.disco.base:rot_mat: tensor([[[ 1.0000,  0.0119,  0.0000],
         [-0.0119,  1.0000,  0.0000],
         [ 0.0000,  0.0000,  1.0000]]], device='cuda:4')
INFO:ekorpkit.models.disco.disco_xform_utils:Running AdaBins depth estimation implementation...
Loading base model ()...
Using cache found in /root/.cache/torch/hub/rwightman_gen-efficientnet-pytorch_master
Done.
Removing last two layers (global_pool & classifier).
Building Encoder-Decoder model..Done.
INFO:ekorpkit.models.disco.disco_xform_utils:Running MiDaS depth estimation implementation...

2D animation mode#

text_prompts = "Brave and beautiful new world in Jeju, artstation matte painting."
batch_name = "newworld-2d"

disco.imagine(
    text_prompts, 
    batch_name=batch_name, 
    steps=300,
    animation_mode = '2D',
#     rotation_3d_z="0: (1)",
#     perlin_init=True,
#     perlin_mode="color",
    diffusion_sampling_mode='ddim',
    max_frames = 50,
    width_height = [768, 512], 
    clip_guidance_scale=7500, 
)

Video Input Mode#

text_prompts = "A beautiful new world in Jeju, artstation matte painting."
batch_name = "newworld-video"

disco.imagine(
    text_prompts, 
    batch_name=batch_name, 
    steps=250,
    animation_mode="Video Input",
    video_init_path="/workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/newworld-3d/newworld-3d(9).mp4",
#     rotation_3d_z="0: (1)",
#     perlin_init=True,
#     perlin_mode="color",
    diffusion_sampling_mode='ddim',
    max_frames = 10,
    width_height = [768, 512], 
    clip_guidance_scale=7500, 
)
INFO:ekorpkit.models.disco.base:warping frames with flow blend ratio: 0.999
INFO:ekorpkit.models.disco.base:Image prompt: []
INFO:ekorpkit.models.disco.base:Frame 4 Prompt: ['A beautiful new world in Jeju, artstation matte painting.']
INFO:ekorpkit.models.disco.base:Seed used: 3402861987
INFO:ekorpkit.models.disco.base: >> elapsed time to diffuse: 0:02:33.218085
INFO:ekorpkit.models.art.base:Saving config to /workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/newworld-video/newworld-video(0)_settings.yaml
../../../../_images/disco_19_5.png

Create a video from output frames#

batch_name = "newworld-video"
batch_num = 0

mp4_path = disco.create_video(
    batch_name=batch_name, 
    batch_num=batch_num, 
)
from IPython.display import Video

Video(mp4_path, embed=True)

collage generated sample images#

disco.collage(
    batch_name=batch_name,
    batch_num=4,
    ncols=2,
    num_images=4,
    show_filename=True,
    fontcolor="black",
)
INFO:ekorpkit.models.dalle.base:Loading config from /workspace/projects/ekorpkit-book/disco-imagen/outputs/disco-diffusion/halla/halla(4)_settings.yaml
INFO:ekorpkit.models.dalle.base:Merging config with diffuse defaults
INFO:ekorpkit.models.disco.base:Will save every 2 steps
INFO:ekorpkit.models.disco.base:Using seed: 221812581
INFO:ekorpkit.models.dalle.base:Prompt: Mt. Halla's beautiful flowers, artstation matte painting
INFO:ekorpkit.io.file:Processing [4] files from ['halla(4)_*.png']
../../../../_images/disco_24_1.png

make gif of progresses of a specific sample image#

disco.make_gif(
    batch_name='halla',
    batch_num=1,
    sample_num=1,
    show=False,
    duration=100,
    force_remake=True,
)
Saved GIF to /workspace/projects/ekorpkit-book/disco-imagen/outputs/halla/halla(1)_0001.gif

show config#

disco.show_config(batch_name=batch_name, batch_num=4)
INFO:ekorpkit.models.disco.base:Loading config from /workspace/projects/ekorpkit-book/disco-imagen/outputs/halla/halla(4)_settings.yaml
INFO:ekorpkit.models.disco.base:Merging config with diffuse defaults
INFO:ekorpkit.models.disco.base:Merging config with args: {}
INFO:ekorpkit.models.disco.base:Will save every 2 steps
INFO:ekorpkit.models.disco.base:Using seed: 3370684779
{'angle': '0:(0)',
 'animation_mode': 'None',
 'batch_name': 'halla',
 'batch_num': 7,
 'batch_size': 1,
 'calc_frames_skip_steps': 150,
 'clamp_grad': True,
 'clamp_max': 0.05,
 'clip_denoised': False,
 'clip_guidance_scale': 5000,
 'cut_ic_pow': 1,
 'cut_icgray_p': '[0.2]*400+[0]*600',
 'cut_innercut': '[4]*400+[12]*600',
 'cut_overview': '[12]*400+[4]*600',
 'cutn_batches': 4,
 'display_rate': 20,
 'eta': 0.8,
 'extract_nth_frame': 2,
 'far_plane': 10000,
 'force_flow_generation': False,
 'fov': 40,
 'frames_scale': 1500,
 'frames_skip_steps': '60%',
 'fuzzy_prompt': False,
 'image_prompts': None,
 'init_image': 'None',
 'init_scale': 1000,
 'intermediate_saves': 250,
 'intermediates_in_subfolder': True,
 'interp_spline': 'Linear',
 'key_frames': True,
 'max_frames': 1,
 'midas_depth_model': 'dpt_large',
 'midas_weight': 0.3,
 'n_samples': 4,
 'near_plane': 200,
 'padding_mode': 'border',
 'perlin_init': False,
 'perlin_mode': 'mixed',
 'persistent_frame_output_in_batch_folder': True,
 'rand_mag': 0.05,
 'randomize_class': True,
 'range_scale': 150,
 'resume_from_frame': 'latest',
 'resume_run': False,
 'retain_overwritten_frames': False,
 'rotation_3d_x': '0: (0)',
 'rotation_3d_y': '0: (0)',
 'rotation_3d_z': '0: (0)',
 'run_to_resume': 'latest',
 'sampling_mode': 'bicubic',
 'sat_scale': 0,
 'seed': 3370684779,
 'set_seed': 'random_seed',
 'show_collage': True,
 'side_x': 768,
 'side_y': 512,
 'skip_augs': False,
 'skip_steps': 10,
 'start_frame': 0,
 'steps': 250,
 'steps_per_checkpoint': 2,
 'stop_on_next_loop': False,
 'text_prompts': {0: ["Mt. Halla's beautiful flowers, artstation matte "
                      'painting'],
                  100: ['This set of prompts start at frame 100',
                        'This prompt has weight five:5']},
 'transformation_percent': [0.09],
 'translation_x': '0: (0)',
 'translation_y': '0: (0)',
 'translation_z': '0: (10.0)',
 'turbo_mode': False,
 'turbo_preroll': 10,
 'turbo_steps': '3',
 'tv_scale': 0,
 'use_horizontal_symmetry': False,
 'use_vertical_symmetry': False,
 'video_init_blend_mode': 'optical flow',
 'video_init_check_consistency': False,
 'video_init_clip_guidance_scale': 1000,
 'video_init_cutn_batches': 4,
 'video_init_file': 'init.mp4',
 'video_init_flow_blend': 0.999,
 'video_init_flow_warp': True,
 'video_init_frames_scale': 15000,
 'video_init_frames_skip_steps': '70%',
 'video_init_path': '/workspace/projects/ekorpkit-book/disco-imagen/init_images/init.mp4',
 'video_init_range_scale': 150,
 'video_init_sat_scale': 300,
 'video_init_seed_continuity': False,
 'video_init_skip_steps': 50,
 'video_init_steps': 100,
 'video_init_tv_scale': 0.1,
 'vr_eye_angle': 0.5,
 'vr_ipd': 5.0,
 'vr_mode': False,
 'width_height': [768, 512],
 'zoom': '0: (1), 10: (1.05)'}

Model Parameters#

disco.parameters()
{'advanced': {'clamp_grad': "true {type: 'boolean'}",
              'clamp_max': "0.05 {type: 'number'}",
              'eta': "0.8 {type: 'number'}",
              'set_seed': "random_seed {type: 'string'}"},
 'advanced_extra': {'clip_denoised': 'false',
                    'fuzzy_prompt': 'false',
                    'rand_mag': '0.05',
                    'randomize_class': 'true'},
 'advanced_perlin_init': {'perlin_init': "false {type: 'boolean'} : Perlin "
                                         'init will replace your init',
                          'perlin_mode': "mixed ['mixed', 'color', 'gray']"},
 'animation_2d': {'angle': "'0:(0)' {type: 'string'} : All rotations are "
                           'provided in degrees.',
                  'far_plane': "10000 {type: 'number'}",
                  'fov': "40 {type: 'number'}",
                  'interp_spline': 'Linear '
                                   "['Linear','Quadratic','Cubic']{type: "
                                   "'string'} : Do not change, currently will "
                                   'not look good.',
                  'key_frames': "true {type: 'boolean'}",
                  'max_frames': "10000 {type: 'number'}",
                  'midas_depth_model': "dpt_large {type: 'string'}",
                  'midas_weight': "0.3 {type: 'number'}",
                  'near_plane': "200 {type: 'number'}",
                  'padding_mode': "border {type: 'string'}",
                  'rotation_3d_x': "'0: (0)' {type: 'string'}",
                  'rotation_3d_y': "'0: (0)' {type: 'string'}",
                  'rotation_3d_z': "'0: (0)' {type: 'string'}",
                  'sampling_mode': "bicubic {type: 'string'}",
                  'translation_x': "'0: (0)' {type: 'string'}",
                  'translation_y': "'0: (0)' {type: 'string'}",
                  'translation_z': "'0: (10.0)' {type: 'string'}",
                  'zoom': "'0: (1), 10: (1.05)' {type: 'string'} : # `zoom` is "
                          'a multiplier of dimensions, 1 is no zoom.'},
 'animation_3d_turbo_mode': {'turbo_mode': "false {type: 'boolean'} : (Starts "
                                           'after frame 10,) skips diffusion '
                                           'steps and just uses depth map to '
                                           'warp images for skipped frames. '
                                           'Speeds up rendering by 2x-4x, and '
                                           'may improve image coherence '
                                           'between frames. For different '
                                           'settings tuned for Turbo Mode, '
                                           'refer to the original Disco-Turbo '
                                           'Github: '
                                           'https://github.com/zippy731/disco-diffusion-turbo',
                             'turbo_preroll': '10 # frames',
                             'turbo_steps': '"3" ["2","3","4","5","6"] {type: '
                                            '"string"}'},
 'animation_3d_vr_mode': {'vr_eye_angle': "0.5 {type: 'number'} : "
                                          '`vr_eye_angle` is the y-axis '
                                          'rotation of the eyes towards the '
                                          'center',
                          'vr_ipd': "5.0 {type: 'number'} : interpupillary "
                                    'distance (between the eyes)',
                          'vr_mode': "false {type: 'boolean'} : Enables stereo "
                                     'rendering of left/right eye views '
                                     '(supporting Turbo) which use a different '
                                     '(fish-eye) camera projection matrix. '
                                     "Note the images you're prompting will "
                                     'work better if they have some inherent '
                                     'wide-angle aspect. The generated images '
                                     'will need to be combined into left/right '
                                     'videos. These can then be stitched into '
                                     'the VR180 format. Google made the VR180 '
                                     'Creator tool but subsequently stopped '
                                     "supporting it. It's available for "
                                     'download in a few places including '
                                     'https://www.patrickgrunwald.de/vr180-creator-download. '
                                     'The tool is not only good for stitching '
                                     '(videos and photos) but also for adding '
                                     'the correct metadata into existing '
                                     'videos, which is needed for services '
                                     'like YouTube to identify the format '
                                     'correctly. Watching YouTube VR videos '
                                     "isn't necessarily the easiest depending "
                                     'on your headset. For instance Oculus '
                                     'have a dedicated media studio and store '
                                     'which makes the files easier to access '
                                     'on a Quest '
                                     'https://creator.oculus.com/manage/mediastudio/. '
                                     'The command to get ffmpeg to concat your '
                                     'frames for each eye is in the form: '
                                     '`ffmpeg -framerate 15 -i frame_%4d_l.png '
                                     'l.mp4` (repeat for r)'},
 'basic': {'clip_guidance_scale': "5000 {type: 'number'}",
           'cutn_batches': "4 {type: 'number'}",
           'range_scale': "150 {type: 'number'}",
           'sat_scale': "0 {type: 'number'}",
           'skip_augs': "false {type: 'boolean'}",
           'steps': "250 [25,50,100,150,250,500,1000] {type: 'raw', "
                    'allow-input: true}',
           'tv_scale': "0 {type: 'number'}",
           'width_height': "[1280, 768] {type: 'raw'}"},
 'coherency': {'frames_scale': "1500 {type: 'integer'} : `frame_scale` tries "
                               'to guide the new frame to looking like the old '
                               'one. A good default is 1500.',
               'frames_skip_steps': "'60%' ['40%', '50%', '60%', '70%', '80%'] "
                                    "{type: 'string'} : `frame_skip_steps` "
                                    'will blur the previous frame - higher '
                                    'values will flicker less but struggle to '
                                    'add enough new detail to zoom into.'},
 'cutn_scheduling': {'cut_ic_pow': "1 {type: 'number'}",
                     'cut_icgray_p': "'[0.2]*400+[0]*600' {type: 'string'}",
                     'cut_innercut': "'[4]*400+[12]*600' {type: 'string'}",
                     'cut_overview': "'[12]*400+[4]*600' {type: 'string'} \n"
                                     '>> Format: `[40]*400+[20]*600` = 40 cuts '
                                     'for the first 400 /1000 steps, then 20 '
                                     'for the last 600/1000. cut_overview and '
                                     'cut_innercut are cumulative for total '
                                     'cutn on any given step. Overview cuts '
                                     'see the entire image and are good for '
                                     'early structure, innercuts are your '
                                     'standard cutn.'},
 'init_image': {'init_image': "None {type: 'string'}",
                'init_scale': "1000 {type: 'integer'}",
                'skip_steps': "10 {type: 'integer'} *Make sure you set "
                              'skip_steps to ~50% of your steps if you want to '
                              'use an init image.*'},
 'run': {'animation_mode': "None ['None', '2D', '3D', 'Video Input'] "
                           "{type:'string'}",
         'batch_name': "TimeToDisco {type: 'string'}",
         'batch_size': '1',
         'diffusion_sampling_mode': "ddim ['plms','ddim']",
         'display_rate': "20 {type: 'number'}",
         'n_samples': "6 {type: 'number'}",
         'resume_from_frame': 'latest',
         'resume_run': 'false',
         'retain_overwritten_frames': 'true',
         'run_to_resume': 'latest',
         'show_collage': 'true',
         'use_secondary_model': 'true'},
 'saving': {'intermediate_saves': "0 {type: 'raw'} : Intermediate steps will "
                                  'save a copy at your specified intervals. '
                                  'You can either format it as a single '
                                  'integer or a list of specific steps. A '
                                  'value of `2` will save a copy at 33% and '
                                  '66%. 0 will save none. A value of `[5, 9, '
                                  '34, 45]` will save at steps 5, 9, 34, and '
                                  '45. (Make sure to include the brackets)',
            'intermediates_in_subfolder': "true {type: 'boolean'}",
            'steps_per_checkpoint': None},
 'transformation': {'transformation_percent': '[0.09]',
                    'use_horizontal_symmetry': "false {type: 'boolean'}",
                    'use_vertical_symmetry': "false {type: 'boolean'}"},
 'video_init': {'video_init_clip_guidance_scale': "1000 {type: 'number'}",
                'video_init_cutn_batches': "4 {type: 'number'}",
                'video_init_range_scale': "150 {type: 'number'}",
                'video_init_sat_scale': "300 {type: 'number'}",
                'video_init_skip_steps': "50 {type: 'integer'}",
                'video_init_steps': '100 [25,50,100,150,250,500,1000]{type: '
                                    "'raw', allow-input: true}",
                'video_init_tv_scale': "0.1 {type: 'number'}"},
 'video_init_coherency': {'force_flow_generation': "false {type:'boolean'}",
                          'video_init_frames_scale': "15000 {type: 'integer'} "
                                                     ': `frame_scale` tries to '
                                                     'guide the new frame to '
                                                     'looking like the old '
                                                     'one. A good default is '
                                                     '1500.',
                          'video_init_frames_skip_steps': "'70%' ['40%', "
                                                          "'50%', '60%', "
                                                          "'70%', '80%'] "
                                                          "{type: 'string'} : "
                                                          '`frame_skip_steps` '
                                                          'will blur the '
                                                          'previous frame - '
                                                          'higher values will '
                                                          'flicker less but '
                                                          'struggle to add '
                                                          'enough new detail '
                                                          'to zoom into.'},
 'video_init_flow': {'video_init_blend_mode': "optical flow ['None', 'linear', "
                                              "'optical flow'] : Call optical "
                                              'flow from video frames and warp '
                                              'prev frame with flow',
                     'video_init_check_consistency': 'false',
                     'video_init_flow_blend': "0.999 {type: 'number'} : 0 - "
                                              'take next frame, 1 - take prev '
                                              'warped frame',
                     'video_init_flow_warp': "true {type: 'boolean'} : Call "
                                             'optical flow from video frames '
                                             'and warp prev frame with flow'},
 'video_init_input': {'extract_nth_frame': "2 {type: 'number'}",
                      'persistent_frame_output_in_batch_folder': 'true {type: '
                                                                 "'boolean'}",
                      'video_init_file': "init.mp4 {type: 'string'}",
                      'video_init_path': '{..path.init_dir}/{.video_init_file}',
                      'video_init_seed_continuity': "false {type: 'boolean'}"},
 'video_output': {'blend': '0.5',
                  'fps': '12',
                  'init_frame': "1 {type: 'number'} : This is the frame where "
                                'the video will start',
                  'last_frame': "final_frame {type: 'number'} \n"
                                '>> You can change i to the number of the last '
                                'frame you want to generate. \n'
                                'It will raise an error if that number of '
                                'frames does not exist.',
                  'skip_video_for_run_all': 'false',
                  'video_init_check_consistency': 'false',
                  'view_video_in_cell': 'false'}}
disco.parameters("display")
[display_rate]
20 {type: 'number'}